package controller;

import DAO.DAOFactory;
import entidade.Aluno;
import entidade.Exercicio;
import entidade.ExercicioTreino;
import entidade.PreTreino;
import entidade.Treino;
import entidade.TreinoPreTreino;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.primefaces.context.RequestContext;
import org.primefaces.event.RowEditEvent;
import org.primefaces.event.SelectEvent;
import util.CalculaIdade;

/**
 *
 * @author Thais
 */
@ManagedBean
@ViewScoped
public class TreinoController implements Serializable {

    private Treino treino;
    private Aluno alunoSelecionado;
    private String idade;
    private String idPreTreino;
    private List<TreinoPreTreino> preTreinoList;
    private String tipoPreTreino;
    private PreTreinoDataModel preTreinoDM;
    private String grupoMuscular;
    private ExercicioDataModel exercicioDM;
    private Exercicio exercicioSelecionado;
    private List<ExercicioTreino> exercicioList;
    private ExercicioTreino dadosExercicio;
    private ExercicioTreinoDataModel exercicioTreinoDM;
    private ExercicioTreino exercicioTreinoSelecionado;
    private ListaTreinoDataModel treinoDM;
    private List<Treino> treinoList;
    private Treino treinoSelecionado;
    private String cabecalhoMsg;
    private String mensagem;
    private boolean deuCerto;

    public TreinoController() {
        HttpServletRequest req = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
        HttpSession session = req.getSession();
        alunoSelecionado = (Aluno) session.getAttribute("alunoSelecionado");

        if (alunoSelecionado != null) {
            idade = String.valueOf(CalculaIdade.calcIdade(alunoSelecionado.getDataNasc()));
        }

        treino = new Treino();
        preTreinoList = new ArrayList<TreinoPreTreino>();
        preTreinoDM = new PreTreinoDataModel(preTreinoList);
        dadosExercicio = new ExercicioTreino();
        exercicioList = new ArrayList<ExercicioTreino>();
        exercicioTreinoDM = new ExercicioTreinoDataModel(exercicioList);
    }

    public Treino getTreino() {
        return treino;
    }

    public void setTreino(Treino treino) {
        this.treino = treino;
    }

    public Aluno getAlunoSelecionado() {
        return alunoSelecionado;
    }

    public void setAlunoSelecionado(Aluno alunoSelecionado) {
        this.alunoSelecionado = alunoSelecionado;
    }

    public String getIdade() {
        return idade;
    }

    public void setIdade(String idade) {
        this.idade = idade;
    }

    public String getIdPreTreino() {
        return idPreTreino;
    }

    public void setIdPreTreino(String idPreTreino) {
        this.idPreTreino = idPreTreino;
    }

    public List<TreinoPreTreino> getPreTreinoList() {
        return preTreinoList;
    }

    public void setPreTreinoList(List<TreinoPreTreino> preTreinoList) {
        this.preTreinoList = preTreinoList;
    }

    public String getTipoPreTreino() {
        return tipoPreTreino;
    }

    public void setTipoPreTreino(String tipoPreTreino) {
        this.tipoPreTreino = tipoPreTreino;
    }

    public PreTreinoDataModel getPreTreinoDM() {
        return preTreinoDM;
    }

    public void setPreTreinoDM(PreTreinoDataModel preTreinoDM) {
        this.preTreinoDM = preTreinoDM;
    }

    public String getGrupoMuscular() {
        return grupoMuscular;
    }

    public void setGrupoMuscular(String grupoMuscular) {
        this.grupoMuscular = grupoMuscular;
    }

    public ExercicioDataModel getExercicioDM() {
        return exercicioDM;
    }

    public void setExercicioDM(ExercicioDataModel exercicioDM) {
        this.exercicioDM = exercicioDM;
    }

    public Exercicio getExercicioSelecionado() {
        return exercicioSelecionado;
    }

    public void setExercicioSelecionado(Exercicio exercicioSelecionado) {
        this.exercicioSelecionado = exercicioSelecionado;
    }

    public List<ExercicioTreino> getExercicioList() {
        return exercicioList;
    }

    public void setExercicioList(List<ExercicioTreino> exercicioList) {
        this.exercicioList = exercicioList;
    }

    public ExercicioTreino getDadosExercicio() {
        return dadosExercicio;
    }

    public void setDadosExercicio(ExercicioTreino dadosExercicio) {
        this.dadosExercicio = dadosExercicio;
    }

    public ExercicioTreinoDataModel getExercicioTreinoDM() {
        return exercicioTreinoDM;
    }

    public void setExercicioTreinoDM(ExercicioTreinoDataModel exercicioTreinoDM) {
        this.exercicioTreinoDM = exercicioTreinoDM;
    }

    public ExercicioTreino getExercicioTreinoSelecionado() {
        return exercicioTreinoSelecionado;
    }

    public void setExercicioTreinoSelecionado(ExercicioTreino exercicioTreinoSelecionado) {
        this.exercicioTreinoSelecionado = exercicioTreinoSelecionado;
    }

    public ListaTreinoDataModel getTreinoDM() {
        return treinoDM;
    }

    public void setTreinoDM(ListaTreinoDataModel treinoDM) {
        this.treinoDM = treinoDM;
    }

    public List<Treino> getTreinoList() {
        return treinoList;
    }

    public void setTreinoList(List<Treino> treinoList) {
        this.treinoList = treinoList;
    }

    public Treino getTreinoSelecionado() {
        return treinoSelecionado;
    }

    public void setTreinoSelecionado(Treino treinoSelecionado) {
        this.treinoSelecionado = treinoSelecionado;
    }

    public String getMensagem() {
        return mensagem;
    }

    public void setMensagem(String mensagem) {
        this.mensagem = mensagem;
    }

    public String getCabecalhoMsg() {
        return cabecalhoMsg;
    }

    public void setCabecalhoMsg(String cabecalhoMsg) {
        this.cabecalhoMsg = cabecalhoMsg;
    }

    public void adicionarPreTreino() {
        PreTreino preTreino;
        String tipo;

        // Adiciona pre treino na lista, caso tenha sido definido qual pre treino e tipo
        if (idPreTreino != null) {
            preTreino = DAOFactory.obterPreTreinoDAO().buscarPreTreino(Long.parseLong(idPreTreino));
            TreinoPreTreino treinoPreTreino = new TreinoPreTreino();
            treinoPreTreino.setPreTreino(preTreino);

            if (tipoPreTreino != null && (!"".equalsIgnoreCase(tipoPreTreino))) {
                tipo = tipoPreTreino;
                // Verificar se o pre treino ja foi adicionado e emite mensagem
                for (TreinoPreTreino tPreTreino : preTreinoList) {
                    if (tPreTreino.getPreTreino().getIdPreTreino().equals(Long.parseLong(idPreTreino))) {
                        if (tPreTreino.getTipoPreTreino().equalsIgnoreCase(tipo)) {
                            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Pré Treino já adicionado!"));
                            return;
                        }
                    }
                }
                treinoPreTreino.setTipoPreTreino(tipo);
                preTreinoList.add(treinoPreTreino);

                if (preTreinoList.size() > 1) {
                    preTreinoDM.setWrappedData(preTreinoList);
                } else {
                    preTreinoDM = new PreTreinoDataModel(preTreinoList);
                }
            } else {
                mensagem = "Um tipo de pré treino deve ser selecionado!";
                cabecalhoMsg = "Pré Treino";
                RequestContext context = RequestContext.getCurrentInstance();
                context.execute("PF('treinoDialog').show()");
            }
        }
    }

    public void onEdit(RowEditEvent event) {
        FacesMessage msg = new FacesMessage("Pré Treino Editado", ((TreinoPreTreino) event.getObject()).getPreTreino().getNome());
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }

    public void onCancel(RowEditEvent event) {
        FacesMessage msg = new FacesMessage("Pré Treino Cancelado", ((TreinoPreTreino) event.getObject()).getPreTreino().getNome());
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }

    public void pesquisarExercicio() {
        List<Exercicio> exercicios = new ArrayList<Exercicio>();
        exercicios = DAOFactory.obterExercicioDAO().buscarPorGrupoMuscular(grupoMuscular);
        exercicioDM = new ExercicioDataModel(exercicios);
    }

    public void onRowSelect(SelectEvent event) {
        dadosExercicio = new ExercicioTreino();
        exercicioSelecionado = (Exercicio) event.getObject();
        dadosExercicio.setExercicio(exercicioSelecionado);
    }

    public void onRowSelectExercicioTreino(SelectEvent event) {
        exercicioTreinoSelecionado = (ExercicioTreino) event.getObject();
    }

    public void onRowSelectTreino(SelectEvent event) {
        treinoSelecionado = (Treino) event.getObject();
    }

    public void excluirExercicioTreino() {
        for (ExercicioTreino exercicioTreinoSelec : exercicioList) {
            if (exercicioTreinoSelecionado.equals(exercicioTreinoSelec)) {
                exercicioList.remove(exercicioTreinoSelecionado);
                exercicioTreinoDM.setWrappedData(exercicioList);
                return;
            }
        }
    }

    public void salvarDados() {
        boolean jaadd = false;

        if (exercicioSelecionado != null) {
            if (dadosExercicio.getNumeroSerie() == 0 || dadosExercicio.getNumeroRepeticoes() == 0) {
                mensagem = "Definir numero de séries e repetições!";
            } else {
                for (ExercicioTreino ex : exercicioList) {
                    if (ex.getExercicio().getIdExercicio().equals(exercicioSelecionado.getIdExercicio())) {
                        mensagem = "Exercicio " + ex.getExercicio().getNome() + "já foi adicionado!";
                        jaadd = true;
                    }
                }
                // se nao adicionou
                if (!jaadd) {
                    int listaExercicio = exercicioList.size() + 1;
                    dadosExercicio.setSequencia(listaExercicio);
                    dadosExercicio.setExercicio(exercicioSelecionado);
                    exercicioList.add(dadosExercicio);
                    mensagem = "Exercício " + exercicioSelecionado.getNome()
                            + " adicionado com " + dadosExercicio.getNumeroSerie() + " série(s) de "
                            + dadosExercicio.getNumeroRepeticoes() + " repetições";
                }
            }
        } else {
            mensagem = "Um exercicio deve ser selecionado!";
        }
        cabecalhoMsg = "Exercício";
        RequestContext context = RequestContext.getCurrentInstance();
        context.execute("PF('treinoDialog').show()");
        dadosExercicio = new ExercicioTreino();
    }

    public void incluirDados() {
        exercicioTreinoDM = new ExercicioTreinoDataModel(exercicioList);
    }

    public void cancelarDados() {
        int var;
        var = exercicioList.size();
        if (var != 0) {
            exercicioList.remove(var);
        }
    }

    public void limparCampos() {
        treino = new Treino();
        idPreTreino = null;
        tipoPreTreino = null;
        preTreinoList = new ArrayList<TreinoPreTreino>();
        preTreinoDM.setWrappedData(preTreinoList);
        exercicioList = new ArrayList<ExercicioTreino>();
        exercicioTreinoDM.setWrappedData(exercicioList);
    }

    public void salvarTreino() {
        String tela = FacesContext.getCurrentInstance().getViewRoot().getViewId();
        char tipo;

        if (alunoSelecionado == null) {
            FacesMessage msg = new FacesMessage("Aluno não selecionado!");
            FacesContext.getCurrentInstance().addMessage(null, msg);
        } else {
            if ("/Telas/alterarTreino.xhtml".equalsIgnoreCase(tela)) {
                tipo = 'U';
            } else {
                tipo = 'C';
                treino.setAluno(alunoSelecionado);
            }
            if (preTreinoList.isEmpty()) {
                mensagem = "Não foi escolhido nenhum Pré-Treino!";
            } else if (exercicioList.isEmpty()) {
                mensagem = "Não foi escolhido nenhum Exercício!";
            } else {
                treino.setPreTreino(preTreinoList);
                treino.setExercicios(exercicioList);
                deuCerto = DAOFactory.obterTreinoDAO().salvarTreino(treino, tipo);

                if (deuCerto) {
                    mensagem = "Treino salvo com sucesso!";
                } else {
                    mensagem = "Erro ao salvar treino!";
                }
            }
            cabecalhoMsg = "Treino";
            RequestContext context = RequestContext.getCurrentInstance();
            context.execute("PF('treinoDialog').show()");
            treino = new Treino();
        }
    }

    @PostConstruct
    public void carregarDados() {
        String tela = FacesContext.getCurrentInstance().getViewRoot().getViewId();

        if (alunoSelecionado == null) {
            FacesMessage msg = new FacesMessage("Aluno não selecionado!");
            FacesContext.getCurrentInstance().addMessage(null, msg);
        } else {
            if ((" ".equalsIgnoreCase(tela))
                    || ("/Telas/visualizarTreino.xhtml".equalsIgnoreCase(tela))) {

                PreTreino preTreino = null;
                int tipo = 0;

//                treinoList = DAOFactory.obterTreinoDAO().buscarTreino(alunoSelecionado);
                HttpServletRequest req = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
                HttpSession session = req.getSession();
                treino = (Treino) session.getAttribute("treinoSelecionado");

                if (treino == null) {
                    FacesMessage msg = new FacesMessage("Aluno não possui treinos!");
                    FacesContext.getCurrentInstance().addMessage(null, msg);
                } else {
                    for (TreinoPreTreino treinoPreTreino : treino.getPreTreino()) {
                        preTreinoList.add(treinoPreTreino);
                    }
                    if (preTreinoList.size() > 1) {
                        preTreinoDM.setWrappedData(preTreinoList);
                    } else {
                        preTreinoDM = new PreTreinoDataModel(preTreinoList);
                    }
                }
                for (ExercicioTreino exercicioTreino : treino.getExercicios()) {
                    exercicioList.add(exercicioTreino);
                    exercicioTreinoDM = new ExercicioTreinoDataModel(exercicioList);
                }
            } else if (("/Telas/listaTreinos.xhtml".equalsIgnoreCase(tela))) {
                treinoList = DAOFactory.obterTreinoDAO().buscarTreino(alunoSelecionado);
                treinoDM = new ListaTreinoDataModel(treinoList);
            }
        }
    }

    public String alterarTreino() {
        if (treinoSelecionado == null) {
            FacesMessage msg = new FacesMessage("Treino não selecionado!");
            FacesContext.getCurrentInstance().addMessage(null, msg);
        } else {
            FacesContext fc = FacesContext.getCurrentInstance();
            HttpSession session = (HttpSession) fc.getExternalContext().getSession(false);
            session.setAttribute("treinoSelecionado", treinoSelecionado);
            return "/Telas/alterarTreino";
        }
        return null;
    }

    public String visualizarTreino() {
        if (treinoSelecionado == null) {
            FacesMessage msg = new FacesMessage("Treino não selecionado!");
            FacesContext.getCurrentInstance().addMessage(null, msg);
        } else {
            FacesContext fc = FacesContext.getCurrentInstance();
            HttpSession session = (HttpSession) fc.getExternalContext().getSession(false);
            session.setAttribute("treinoSelecionado", treinoSelecionado);
            return "/Telas/visualizarTreino";
        }
        return null;
    }
}
